﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace KinectControl
{
    public static class Log
    {
        private static string arquivo;
        public static string Arquivo
        {
            get
            {
                if (string.IsNullOrEmpty(arquivo))
                {
                    string path = AppDomain.CurrentDomain.BaseDirectory + @"Log";

                    //Verifica se existe o diretório
                    if (!Directory.Exists(path))
                        Directory.CreateDirectory(path);

                    //Especifica o arquivo para gravação
                    Arquivo = string.Format(path + @"\Log_{0}.txt", DateTime.Now.ToShortDateString().Replace("/", "."));
                }
                return arquivo;
            }
            set
            {
                //Validar diretorio/arquivo
                arquivo = value;
            }
        }

        public static void GravarLog(string texto)
        {
            int erroCounter = 0;
            bool isReady = false;
            
            while (isReady.Equals(false))
            {
                try
                {
                    //http://msdn.microsoft.com/pt-br/library/8bh11f1k.aspx
                    using (StreamWriter file = new StreamWriter(Arquivo, true))
                    {
                        // tenta gravar o arquivo texto...
                        file.WriteLine(string.Format("{0} - {1}", DateTime.Now, texto));
                        isReady = true;
                    }
                }
                // ... caso ocorra algum erro aguarda um tempo e executa novamente
                // repete este procedimento por 4 vezes, se o erro continuar o log não será gravado
                catch
                {
                    System.Threading.Thread.Sleep(500);
                    if (++erroCounter == 4)
                        isReady = true;
                }
            }
        }

        public static void GravarLog(string texto, System.Exception ex)
        {
            int erroCounter = 0;
            bool isReady = false;


            if (ex != null)
            {
                texto += Environment.NewLine + ex.Message;

                if (!string.IsNullOrEmpty(ex.StackTrace))
                    texto += Environment.NewLine + "StackTrace: " + ex.StackTrace;

                if (ex.InnerException != null)
                    texto += Environment.NewLine + "InnerException: " + ex.InnerException.Message;

                texto += Environment.NewLine;
            }

            while (isReady.Equals(false))
            {
                try
                {
                    //http://msdn.microsoft.com/pt-br/library/8bh11f1k.aspx
                    using (StreamWriter file = new StreamWriter(Arquivo, true))
                    {
                        // tenta gravar o arquivo texto...
                        file.WriteLine(string.Format("{0} - {1}", DateTime.Now, texto));
                        isReady = true;
                    }
                }
                // ... caso ocorra algum erro aguarda um tempo e executa novamente
                // repete este procedimento por 4 vezes, se o erro continuar o log não será gravado
                catch
                {
                    System.Threading.Thread.Sleep(500);
                    if (++erroCounter == 4)
                        isReady = true;
                }
            }
        }
    }
}
